home *** CD-ROM | disk | FTP | other *** search
- Path: wkaufman.us.oracle.com!wkaufman
- From: wkaufman@wkaufman.us.oracle.com (William Kaufman)
- Newsgroups: comp.lang.c
- Subject: Re: Apology, was: Re: Limit on #bytes inside of struct?
- Date: 12 Feb 1996 16:43:54 GMT
- Organization: Oracle Corporation, Redwood Shores CA
- Message-ID: <4fnqoa$f7t@inet-nntp-gw-1.us.oracle.com>
- References: <311F15D8.78D1@zess.uni-siegen.de> <9602121217.AA07160@dxmint.cern.ch> <311F4F4D.7784@zess.uni-siegen.de>
- NNTP-Posting-Host: wkaufman.us.oracle.com
-
- In article <311F4F4D.7784@zess.uni-siegen.de> Markus Becker <becker@zess.uni-siegen.de> writes:
- ]
- ] > o As steps #1 and #2 mentioned above will show you, an array decays into
- ] > a pointer only when used in a value context. And, of course, pointers
- ] > and arrays are _not_ equivalent and cannot be used interchangeably.
- ]
- ] I had a sentence somewhere in the back of my mind "that arrays and pointers
- ] in C are equivalent and completely interchangeable". Could it be K&R?
-
- I think it was the comp.lang.c FAQ:
-
- 6.2: But I heard that char a[] was identical to char *a.
-
- A: Not at all. (What you heard has to do with formal parameters to
- functions; see question 6.4.) Arrays are not pointers. The
- array declaration char a[6] requests that space for six
- characters be set aside, to be known by the name "a." That is,
- there is a location named "a" at which six characters can sit.
- The pointer declaration char *p, on the other hand, requests a
- place which holds a pointer, to be known by the name "p." This
- pointer can point almost anywhere: to any char, or to any
- contiguous array of chars, or nowhere (see also questions 5.1
- and 1.30).
-
- As usual, a picture is worth a thousand words. The declarations
-
- char a[] = "hello";
- char *p = "world";
-
- would initialize data structures which could be represented like
- this:
- +---+---+---+---+---+---+
- a: | h | e | l | l | o |\0 |
- +---+---+---+---+---+---+
- +-----+ +---+---+---+---+---+---+
- p: | *======> | w | o | r | l | d |\0 |
- +-----+ +---+---+---+---+---+---+
-
- It is important to realize that a reference like *x*[3]
- generates different code depending on whether *x* is an array or
- a pointer. Given the declarations above, when the compiler sees
- the expression a[3], it emits code to start at the location "a,"
- move three past it, and fetch the character there. When it sees
- the expression p[3], it emits code to start at the location "p,"
- fetch the pointer value there, add three to the pointer, and
- finally fetch the character pointed to. In other words, a[3] is
- three places past (the start of) the object *named* a, while
- p[3] is three places past the object *pointed to* by p. In the
- example above, both a[3] and p[3] happen to be the character
- 'l', but the compiler gets there differently.
-
- References: K&R2 Sec. 5.5 p. 104; CT&P Sec. 4.5 pp. 64-5.
-
- Please don't post again until you've read the FAQ. Thank you.
-
- The FAQ is posted at the beginning of each month (and, in abridged
- form, in the middle of the month) to comp.lang.c and comp.answers. It's
- also available by anonymous FTP from pit-manager.mit.edu or rtfm.mit.edu
- (directory pub/usenet/news.answers/C-faq/ and pub/usenet/comp.lang.c/);
- and ftp.uu.net (directory usenet/news.answers/C-faq/).
-
- -- Bill K.
-
- Bill Kaufman, | "People look better under arrest,...it gives you
- wkaufman@us.oracle.com | an aggressive fashion look." -- John Waters
-